草庐IT

Java OutOfMemoryError 奇怪的行为

全部标签

c++ - 奇怪的数据对齐

据我所知,数据对齐是将数据放入内存中的64位/32位block中以提高CPU性能,我使用的是64位linux机器,我做了一些测试并得到了一些奇怪的结果(我无法解释行为)。这是我使用的结构:classA{longl0,l1,l2;};classB{longl0,l1,l2,l3;};classC{longl0,l1,l2,l3,l4;};测试:intmain(){C*newC=newC();B*newB=newB();A*newA=newA();int*i=newint();std::cout只是将每个对象的1个对象放入堆中,我在末尾添加了一个指针以查看newA占用的内存结果是这样的:2

c++ - 这个 DWORD 相关代码是未定义行为吗?

这是我第三次尝试澄清我对这个话题的困惑。但这次我有不同的问题。我有这个代码DWORDv1,v2,v3,Build;GetVersion(&v1,&v2,&v3,&Build);sprintf(VersionStr,"%d.%d.%d.%d",v1,v2,v3,Build);大概是10年前使用VisualStudio编写的。我知道DWORD始终是unsigned-这是真的吗?现在,here,其中一个答案引用了某个版本的标准(这个标准版本是否适用于我的代码?),其中说明了va_arg:Thestandardisn't100%clearonthispoint.Ononehand,youget

c++ - 是否有任何技术可以检测 GCC 的未定义行为?

如果程序未按照C++11标准以可预测的方式运行,是否有任何命令行选项或技术可以使GCC编译器报告错误? 最佳答案 ...tomakethecompilertoreportsomeerrors...是的,有许多警告确实检测到可能的UB,您可以使用GCC的-Werror选项将警告转换为错误。也如@LogicStuff'scomment中所述GCC支持UndefinedBehaviorSanitizer.虽然检测UB较好的工具大多是静态代码分析工具,可以检测出大部分此类缺陷。无论如何,您都必须处理误报,并且需要再次深入检查您的代码。

c++ - 无法解释编译器的行为

考虑这个简单的代码:classA{public:intvalue;A(intvalue){this->value=value;}~A(){printf("destroying%d\n",value);}Aoperator++(){returnA(value+1);}};intmain(){Aa(1);printf("beforeincrement:%d\n",a.value);a=++a;printf("afterincrement:%d\n",a.value);return0;}这个输出:beforeincrement:1destroying2afterincrement:2dest

c++ - 为多平台编译时围绕未定义行为的混淆

我最近发现在C++中以两个下划线开头的任何内容都是未定义的行为。所以我一直在修复我所有的include守卫。但是我遇到过这样的代码#ifdef__WINDOWS___#endif#ifdef__GNUC__#endif但是不是在Windows编译器UB上使用__GNUC__,反之亦然吗?我应该在这里做什么? 最佳答案 你对规则有点误解。您可以使用您的工具链已经(或未)#DEFINEd的东西,即使以两个下划线开头。您自己#DEFINE以两个下划线开头的内容肯定不好。这是一个有用的约定;这意味着您的源代码不能与您的编译器实现C++标准的

c++ - 奇怪的函数调用约定

我正在windbg中调试一个x86DLL,特别是一个据称具有以下签名的函数:bool__cdeclfunc(LPVOIDp1,LPVOIDp2,wchar_t*p3,size_tp4,LPVOIDp5)函数未导出。AFAIK__cdecl应该接收堆栈上的所有参数,caller应该清除堆栈。但事实并非如此。Windbg说调用约定是__cdecl但前两个参数在ecx和edx上传递,就像__fastcall功能。此外,函数本身正在清除堆栈,(我认为)不应该由__cdecl函数完成。我试图Hook该函数但没有成功。我尝试将绕行函数设置为__cdecl和__fastcall并且都导致崩溃。有什么

c++ - 奇怪的 C++ namespace 解析怪癖和 g++ 与 clang++

这个问题在这里已经有了答案:Injectedclassnamecompilerdiscrepancy(3个答案)关闭4年前。这始于观察。我更改了一些看起来有点像这样的代码(编辑:我在这里取出了指定的初始化器,它们也不在原始代码中):structS{enumE{E1,E2}member;}//file1.ccSv1={S::E1};//file2.ccSv2={S::S::E2};请注意file2.cc过度限定了E2。然而,这在g++和clang++中都有效。(编辑2:这个特定VM上的g++是g++-5.4.1,但原始代码已经通过早期和后来的g++版本,加上多个clang版本。)事实上,

c++ - ROS AsyncSpinner 的多线程行为

我试图了解ROS中的AsyncSpinner是如何工作的,因为我可能误解了一些东西。大家可以找一个类似的问题here.如图所示here它的定义提到:Asynchronousspinner:spawnsacoupleofthreads(configurable)thatwillexecutecallbacksinparallelwhilenotblockingthethreadthatcalledit.Thestart/stopmethodallowstocontrolwhenthecallbacksstartbeingprocessedandwhenitshouldstop.而在官方文

c++ - static_cast 和 dynamic_cast 在特定场景中的不同行为

在下面的场景中,我没有弄清楚static_cast和dynamic_cast之间的真正区别:**///withstatic_cast///**classFoo{};classBar:publicFoo{public:voidfunc(){return;}};intmain(intargc,char**argv){Foo*f=newFoo;Bar*b=static_cast(f);b->func();return0;}Output:SuccessfullyBuildandCompiled!**///withdynamic_cast///**classFoo{};classBar:publ

c++ - 奇怪的错误 : cannot convert from 'int' to 'ios_base::openmode'

我正在使用g++编译一些代码。我写了以下片段:boolWriteAccess=true;stringName="my_file.txt";ofstreamFile;ios_base::open_modeMode=std::ios_base::in|std::ios_base::binary;if(WriteAccess)Mode|=std::ios_base::out|std::ios_base::trunc;File.open(Name.data(),Mode);我收到这些错误...知道为什么吗?错误1:从“int”到“std::_Ios_Openmode”的无效转换错误2:初始化'